#pragma once
#include <string>
#include <cstddef> // std::size_t
#include <odb/nullable.hxx>
#include <odb/core.hxx>

namespace zjx_im
{
#pragma db object table("user")
    class User
    {
    public:
        User() {};
        // 用户名--新增用户--用户ID，昵称，密码
        User(const std::string &uid, const std::string &nickname, const std::string &password)
            : _user_id(uid),
              _nickname(nickname),
              _password(password)
        {
        }
        // 手机号--新增用户 -- 用户ID，手机号，随机昵称
        User(const std::string &uid, const std::string &phone)
            : _user_id(uid),
              _nickname(uid),
              _phone(phone)
        {
        }
        std::string user_id() { return _user_id; }
        void user_id(const std::string &uid) {_user_id = uid;}
        std::string nickname() { 
            if (_nickname) return *_nickname; 
            return std::string();
        }
        void nickname(const std::string &val) { _nickname = val; }

        std::string description() { 
            if (!_description) return std::string();
            return *_description; 
        }
        void description(const std::string &val) { _description = val; }
        
        std::string password() { 
            if (!_password) return std::string();
            return *_password; 
        }
        void password(const std::string &val) { _password = val; }

        std::string phone() { 
            if (!_phone) return std::string();
            return *_phone; 
        }
        void phone(const std::string &val) { _phone = val; }

        std::string avatar_id() { 
            if (!_avatar_id) return std::string();
            return *_avatar_id; 
        }
        void avatar_id(const std::string &val) { _avatar_id = val; }

    private:
        friend class odb::access;
#pragma db id auto
        unsigned long _id; // 主键id
#pragma db type("varchar(255)") index unique
        std::string _user_id;
#pragma db type("varchar(64)") index unique
        odb::nullable<std::string> _nickname;    // 用户昵称不一定存在,比如说手机号注册的
        odb::nullable<std::string> _description; // 用户签名 - 不一定存在
#pragma db type("varchar(64)")
        odb::nullable<std::string> _password; // 用户密码，不一定存在
#pragma db type("varchar(64)") index unique
        odb::nullable<std::string> _phone; // 用户手机号， 不一定存在
#pragma db type("varchar(64)")
        odb::nullable<std::string> _avatar_id; // 用户头像文件id，不一定存在
    };
}

//odb -d mysql --generate-query --generate-schema --profile boost/date-time person.hxx